package BehavioralPattern.TemplateMethod;

/**
 * @Classname : TemplateMethodClient
 * @Description : 测试 模板方法
 * 行为型——模板方法
 * 一、模式定义
 *   Define the skeleton of an algorithm in an operation, deferring some steps to subcrasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
 *   （定义一个操作中的算法的框架，而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。）
 *   注意：
 *     为了防止恶意的操作，一般模板方法都加上final关健字，不允许被覆写。
 *     在软件开发过程中，如果相同的一段代码拷贝过两次，就需要对设计产生怀疑，架构师要明确地说明为什么相同的逻辑要出现两次或更多次。
 *   优点：
 *     封装不变，扩展可变。
 *     提取公共，便于维护。
 *     父类通过模板方法控制行为，子类通过基本方法具体实现。
 *   缺点：
 *     复杂项目中增大代码阅读难度，会让新手产生不适感。
 * 二、模式类图
 *   https://kdocs.cn/l/cn1j1XuiZ0Q8
 * 三、适用场景
 *   1、多个子类有公有的方法，并且逻辑基本相同时。
 *   2、重要、复杂的算法，可以把核心算法设计为模板方法，周边的相关细节功能则由各个子类实现。
 * 四、应用举例
 * @Author : chentianyu
 * @Date 2023/1/19 01:22
 */


public class TemplateMethodClient {
    public static void main(String[] args) {
        System.out.println("测试 模板方法模式");
        AbstractPhone xiaomi = new XIAOMI();
        xiaomi.run();
        System.out.println();
        AbstractPhone huawei = new HUAWEI();
        huawei.run();
        System.out.println("--------------------------------------------------------------------");
    }
}

/** 20230119
 * 测试 模板方法模式
 * 小米手机开机
 * 小米手机屏幕点亮
 * 小米手机应用运行
 * 小米手机电量耗尽关机
 *
 * 华为手机开机
 * 华为手机屏幕点亮
 * 华为手机应用运行
 * --------------------------------------------------------------------
 */
